knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(GGally)

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
library(patchwork)

#Setting the data filepath

file_path <-"~/Documents/BI685Files/GitHubDocs/chronister_andrew/data"
sparrows_raw <- read_tsv(file.path(file_path, "sparrows.txt"))
Parsed with column specification:
cols(
  wingcrd = col_double(),
  flatwing = col_double(),
  tarsus = col_double(),
  head = col_double(),
  culmen = col_double(),
  nalospi = col_double(),
  wt = col_double(),
  bandstat = col_double(),
  initials = col_double(),
  Year = col_double(),
  Month = col_double(),
  Day = col_double(),
  Location = col_double(),
  SpeciesCode = col_double(),
  Sex = col_double(),
  Age = col_double()
)
View(sparrows_raw)
sparrows_raw
sparrows <- sparrows_raw %>%
  mutate(box_group = "Sparrows",
         row_order = 1:nrow(.))
View(sparrows)

#Figure 2: Outliers

plot_box <- sparrows %>%
  ggplot(aes(x = box_group,
             y = wingcrd))+
  geom_boxplot(width = 0.25)+
  labs(x = NULL,
       y = "Wing length (mm)")

#Create Cleveland plot

plot_cleveland <- sparrows %>%
  ggplot(aes(x = wingcrd,
             y = row_order))+
  geom_point()+
  labs(x = "Wing length (mm)",
       y = "Order of the data")

#Store plots into variables… #Plot both plots side by side.

plot_box + plot_cleveland

#Add Coordinate Flip so scales line up

plot_box + plot_cleveland + coord_flip()

#Create Culmen variable

p_culmen <-  sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = culmen)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_culmen

#Create nalospi variable

p_nalospi <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = nalospi)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_nalospi

#Create wt variable

p_wt <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wt)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wt

NA

#Create wingcrd variable (I’m using copy/paste on the three lines of theme because I’m lazy…)

p_wingcrd <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wingcrd)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wingcrd

#Create tarsus variable

p_tarsus <- sparrows %>%
  ggplot(aes(y = row_order))+
  geom_point(aes(x = tarsus))+
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_tarsus

#Create head variable

p_head <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = head)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_head

#Now, put them all together in one figure.

p_culmen <-  sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = culmen)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_nalospi <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = nalospi)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wt <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wt)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_wingcrd <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = wingcrd)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_tarsus <- sparrows %>%
  ggplot(aes(y = row_order))+
  geom_point(aes(x = tarsus))+
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_head <- sparrows %>%
  ggplot(aes(y = row_order)) +
  geom_point(aes(x = head)) +
  theme(axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank())
p_culmen + p_nalospi + p_wt + p_wingcrd + p_tarsus + p_head + plot_layout(ncol = 3, nrow = 2)

#It looks like there is one possible outlier in nalospi, one in wingcrd, one in tarsus and two in head. All of these would need further consideration, just like the wingcrd example, to determine if the value is practical or an error.

####Figure 5 #First code block to re-create the histogram

h1 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  ggplot() +
  geom_histogram(aes(x = wt),
                 binwidth = 0.5,
                 boundary = 0,
                 closed = "right",
                 color = "black") +
  scale_x_continuous(breaks = seq(14,28,by = 2))
h1

#Filter all but June, July and August, etc.

h2 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  mutate(Month = case_when(
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August")) %>%
  ggplot() +
  geom_histogram(aes(x = wt),
                 binwidth = 0.5,
                 boundary = 0,
                 color = "black") +
  scale_x_continuous(breaks = seq(14,28,by = 2)) +
  facet_wrap(~Month, ncol = 1)
h2

#Now assemble into one figure.

h1 + h2

#Grad/Honors density plot. #Left panel playground(where I’ll figure out how to do it)

dp_1 <- sparrows %>%
  filter(Month %in% 6:8) %>%
  ggplot() +
  geom_density(aes(x = wt)) +
  scale_x_continuous(breaks = seq(14,28, by = 2))
dp_1

#Ok. That looks similar enough to the example in the notes. Now, on to the filled density plot trinity. Breakthrough. That is kinda pretty…

dp_2 <- sparrows %>%
  filter(Month %in% 6:8)%>%
  mutate(Month = case_when(
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August")) %>%
  ggplot()+
  geom_density(aes(x = wt,
                   fill = Month),
               alpha = 0.42)+
  scale_x_continuous(breaks = seq(14, 28, by = 2))
dp_2

#Now simply put the two together.

dp_1 + dp_2 + plot_layout(nrow = 1)

#Create ggscatmat plot of data using first 7 columns

sparrows %>% ggscatmat(columns = 1:7)

#Tis a thing of beauty, and really, really easy.

#Figure 11: Interactions

month_order <-  c("May", "June", "July", "August", "September")
sparrows %>%
  filter(Month %in% 5:9,
         Sex != 0) %>%
  mutate(Month = case_when(
    Month == 5 ~ "May",
    Month == 6 ~ "June",
    Month == 7 ~ "July",
    Month == 8 ~ "August",
    Month == 9 ~ "September"),
    Month = factor(Month, levels = month_order, ordered = TRUE),
    Sex = ifelse(Sex == 4, "Male", "Female")) %>%
  ggplot(aes(x = wingcrd,
             y = wt))+
  geom_point()+
  geom_smooth(method = lm, se = FALSE)+
  facet_grid(Sex ~ Month)

Part 2:Aegla Crab-fest

#import the raw data

aegla_raw <- read_csv(file.path(file_path, "aegla_crabs.csv"))
Parsed with column specification:
cols(
  .default = col_double(),
  Site = col_character()
)
See spec(...) for full column specifications.
aegla_raw

#Select to remove certain columns

aegla_select <- select(aegla_raw, -Site, -AT, -WT, -Shrimp, -Aeglam, -AeglaFe, -AeglaFo)
aegla_select

#Use drop_na to drop row with NAs

aegla_dropna <- aegla_select %>%
  drop_na(4:12)
aegla_dropna

#Create the row_order dummy variable

aegla_clean <- aegla_dropna %>%
  mutate(box_group = "Crabs",
         row_order = 1:nrow(.))
aegla_clean

#Trying the more efficient pipe method.

aegla <- aegla_raw %>%
  select(-c("Site", "AT", "WT", "Shrimp", "Aeglam", "AeglaFe", "AeglaFo"))%>%
  drop_na(c("N"))%>%
  mutate(box_group = "Crabs",
         row_order = 1:nrow(.))
aegla

#Explore the data

p_width <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Width))
             
p_depth <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Depth))
             
p_flow <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Flow))
p_ph <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=pH))
p_tds <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=TDS))
p_cond<- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Cond))
p_n <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=N))
p_ni <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Ni))
p_nt <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Nt))
p_phos <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Phos))
p_mg <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Mg))
p_ca <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Ca))
p_crab <- aegla %>%
  ggplot(aes(x=row_order))+
  geom_point(aes(y=Crab))
p_width + p_depth + p_flow 

p_ph + p_tds + p_cond  

p_n + p_ni + p_nt 

p_phos + p_mg + p_ca + p_crab

ggplot(aegla, aes(x=row_order, y=Phos))+
  geom_boxplot()+
  geom_point()

#The outliers I found are sample 1, where the Phosphate levels are almost 4 times higher than the next highest value, sample 14 has low pH at 6.25, with the next lowest measurement being 6.75 and 0 waterflow, and sample 22 was taken at a width of 12.5 (meters?) and a depth of 5 meters. The width measurement is not much of an outlier, but the depth measurement is twice as deep as the next highest value. I would contend that the real outlier is the phosphate level in sample 1.

#Plot four variables with a Cleveland plot. It just so happened that I made plots for all of the variables…

p_width + p_depth + p_cond + p_crab + plot_layout(nrow = 2, ncol = 2)

#Make three histograms

ha1 <- ggplot(data = aegla)+
  geom_histogram(aes(x = N),
                 binwidth = .0025,
                 boundary = 0,
                 closed = "right",
                 color = "black")
ha1

NA
NA
NA
ha2 <- ggplot(data = aegla)+
  geom_histogram(aes(x=Phos),
                 binwidth = .005,
                 boundary = 0,
                 closed = "right",
                 color = "blue")
ha2

ha3 <-  ggplot(aegla)+
  geom_histogram(aes(x=pH),
                 binwidth = .005,
                 boundary = 0,
                 closed = "right",
                 color = "red")
ha3

#Create density plots

hdp1 <- ggplot(aegla)+
  geom_density(aes(x=N))
hdp1

hdp2 <- ggplot(aegla)+
  geom_density(aes(x=Phos))
hdp2

hdp3 <- ggplot(aegla)+
  geom_density(aes(x=pH))
hdp3

#Use patchwork to produce 2 col matrix

ha1 + hdp1 + ha2 + hdp2 + ha3 + hdp3 + plot_layout(ncol=2, nrow = 3)

#ggpairs plot… see what happens.

aegla %>% ggpairs

#Wow. That is a huge table. I’m going to use ggscatmat for a different view.

aegla %>% ggscatmat()
Factor variables are omitted in plot

#I’d say there are too many variables going on to be useful. But if we pare it down a bit…

aegla %>% ggpairs(columns = 1:6)

#This makes a lot more sense. TDS and Conductivity have a strong correlation, which makes sense with solids desoved in the water, pH and TDS have a pretty good correlation which also makes sense. I’ll try with the other variables.

aegla %>% ggpairs(columns = 7:13)

LS0tCnRpdGxlOiAiSFcgMDcgUGFydCAxOiBEYXRhIFZpc3VhbGl6YXRpb24iCmF1dGhvcjogIkFuZHJldyBDaHJvbmlzdGVyIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQpgYGB7cn0KCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoR0dhbGx5KQpsaWJyYXJ5KHBhdGNod29yaykKYGBgCgojU2V0dGluZyB0aGUgZGF0YSBmaWxlcGF0aApgYGB7cn0KZmlsZV9wYXRoIDwtIn4vRG9jdW1lbnRzL0JJNjg1RmlsZXMvR2l0SHViRG9jcy9jaHJvbmlzdGVyX2FuZHJldy9kYXRhIgpzcGFycm93c19yYXcgPC0gcmVhZF90c3YoZmlsZS5wYXRoKGZpbGVfcGF0aCwgInNwYXJyb3dzLnR4dCIpKQpWaWV3KHNwYXJyb3dzX3JhdykKc3BhcnJvd3NfcmF3CmBgYApgYGB7cn0Kc3BhcnJvd3MgPC0gc3BhcnJvd3NfcmF3ICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiU3BhcnJvd3MiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpClZpZXcoc3BhcnJvd3MpCmBgYAojRmlndXJlIDI6IE91dGxpZXJzIApgYGB7cn0KcGxvdF9ib3ggPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh4ID0gYm94X2dyb3VwLAogICAgICAgICAgICAgeSA9IHdpbmdjcmQpKSsKICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjI1KSsKICBsYWJzKHggPSBOVUxMLAogICAgICAgeSA9ICJXaW5nIGxlbmd0aCAobW0pIikKYGBgCiNDcmVhdGUgQ2xldmVsYW5kIHBsb3QKYGBge3J9CnBsb3RfY2xldmVsYW5kIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeCA9IHdpbmdjcmQsCiAgICAgICAgICAgICB5ID0gcm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludCgpKwogIGxhYnMoeCA9ICJXaW5nIGxlbmd0aCAobW0pIiwKICAgICAgIHkgPSAiT3JkZXIgb2YgdGhlIGRhdGEiKQpgYGAKI1N0b3JlIHBsb3RzIGludG8gdmFyaWFibGVzLi4uCiNQbG90IGJvdGggcGxvdHMgc2lkZSBieSBzaWRlLgpgYGB7cn0KcGxvdF9ib3ggKyBwbG90X2NsZXZlbGFuZApgYGAKI0FkZCBDb29yZGluYXRlIEZsaXAgc28gc2NhbGVzIGxpbmUgdXAKYGBge3J9CnBsb3RfYm94ICsgcGxvdF9jbGV2ZWxhbmQgKyBjb29yZF9mbGlwKCkKYGBgCiNDcmVhdGUgQ3VsbWVuIHZhcmlhYmxlCmBgYHtyfQpwX2N1bG1lbiA8LSAgc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBjdWxtZW4pKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF9jdWxtZW4KYGBgCiNDcmVhdGUgbmFsb3NwaSB2YXJpYWJsZQpgYGB7cn0KcF9uYWxvc3BpIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbmFsb3NwaSkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkKYGBgCiNDcmVhdGUgd3QgdmFyaWFibGUKYGBge3J9CnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3d0CiAgCmBgYAojQ3JlYXRlIHdpbmdjcmQgdmFyaWFibGUgKEknbSB1c2luZyBjb3B5L3Bhc3RlIG9uIHRoZSB0aHJlZSBsaW5lcyBvZiB0aGVtZSBiZWNhdXNlIEknbSBsYXp5Li4uKQpgYGB7cn0KcF93aW5nY3JkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gd2luZ2NyZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQKYGBgCiNDcmVhdGUgdGFyc3VzIHZhcmlhYmxlCmBgYHtyfQpwX3RhcnN1cyA8LSBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh4ID0gdGFyc3VzKSkrCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKcF90YXJzdXMKYGBgCiNDcmVhdGUgaGVhZCB2YXJpYWJsZQpgYGB7cn0KcF9oZWFkIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gaGVhZCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQKYGBgCiNOb3csIHB1dCB0aGVtIGFsbCB0b2dldGhlciBpbiBvbmUgZmlndXJlLiAKYGBge3J9CnBfY3VsbWVuIDwtICBzcGFycm93cyAlPiUKICBnZ3Bsb3QoYWVzKHkgPSByb3dfb3JkZXIpKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGN1bG1lbikpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX25hbG9zcGkgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBuYWxvc3BpKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfd3QgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3dCkpICsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX3dpbmdjcmQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSB3aW5nY3JkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfdGFyc3VzIDwtIHNwYXJyb3dzICU+JQogIGdncGxvdChhZXMoeSA9IHJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHggPSB0YXJzdXMpKSsKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpwX2hlYWQgPC0gc3BhcnJvd3MgJT4lCiAgZ2dwbG90KGFlcyh5ID0gcm93X29yZGVyKSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBoZWFkKSkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCnBfY3VsbWVuICsgcF9uYWxvc3BpICsgcF93dCArIHBfd2luZ2NyZCArIHBfdGFyc3VzICsgcF9oZWFkICsgcGxvdF9sYXlvdXQobmNvbCA9IDMsIG5yb3cgPSAyKQpgYGAKI0l0IGxvb2tzIGxpa2UgdGhlcmUgaXMgb25lIHBvc3NpYmxlIG91dGxpZXIgaW4gbmFsb3NwaSwgb25lIGluIHdpbmdjcmQsIG9uZSBpbiB0YXJzdXMgYW5kIHR3byBpbiBoZWFkLiBBbGwgb2YgdGhlc2Ugd291bGQgbmVlZCBmdXJ0aGVyIGNvbnNpZGVyYXRpb24sIGp1c3QgbGlrZSB0aGUgd2luZ2NyZCBleGFtcGxlLCB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIHByYWN0aWNhbCBvciBhbiBlcnJvci4gCgojIyMjRmlndXJlIDUKI0ZpcnN0IGNvZGUgYmxvY2sgdG8gcmUtY3JlYXRlIHRoZSBoaXN0b2dyYW0KYGBge3J9CmgxIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gd3QpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gMC41LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkKaDEKYGBgCiNGaWx0ZXIgYWxsIGJ1dCBKdW5lLCBKdWx5IGFuZCBBdWd1c3QsIGV0Yy4KYGBge3J9CmgyIDwtIHNwYXJyb3dzICU+JQogIGZpbHRlcihNb250aCAlaW4lIDY6OCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSB3dCksCiAgICAgICAgICAgICAgICAgYmlud2lkdGggPSAwLjUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTQsMjgsYnkgPSAyKSkgKwogIGZhY2V0X3dyYXAofk1vbnRoLCBuY29sID0gMSkKaDIKYGBgCiNOb3cgYXNzZW1ibGUgaW50byBvbmUgZmlndXJlLgpgYGB7cn0KaDEgKyBoMgpgYGAKI0dyYWQvSG9ub3JzIGRlbnNpdHkgcGxvdC4KI0xlZnQgcGFuZWwgcGxheWdyb3VuZCh3aGVyZSBJJ2xsIGZpZ3VyZSBvdXQgaG93IHRvIGRvIGl0KQpgYGB7cn0KZHBfMSA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpICU+JQogIGdncGxvdCgpICsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE0LDI4LCBieSA9IDIpKQpkcF8xCmBgYAojT2suIFRoYXQgbG9va3Mgc2ltaWxhciBlbm91Z2ggdG8gdGhlIGV4YW1wbGUgaW4gdGhlIG5vdGVzLiAgTm93LCBvbiB0byB0aGUgZmlsbGVkIGRlbnNpdHkgcGxvdCB0cmluaXR5LiAgQnJlYWt0aHJvdWdoLiBUaGF0IGlzIGtpbmRhIHByZXR0eS4uLgpgYGB7cn0KZHBfMiA8LSBzcGFycm93cyAlPiUKICBmaWx0ZXIoTW9udGggJWluJSA2OjgpJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIpKSAlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2RlbnNpdHkoYWVzKHggPSB3dCwKICAgICAgICAgICAgICAgICAgIGZpbGwgPSBNb250aCksCiAgICAgICAgICAgICAgIGFscGhhID0gMC40MikrCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNCwgMjgsIGJ5ID0gMikpCmRwXzIKYGBgCiNOb3cgc2ltcGx5IHB1dCB0aGUgdHdvIHRvZ2V0aGVyLiAKYGBge3J9CmRwXzEgKyBkcF8yICsgcGxvdF9sYXlvdXQobnJvdyA9IDEpCmBgYAojQ3JlYXRlIGdnc2NhdG1hdCBwbG90IG9mIGRhdGEgdXNpbmcgZmlyc3QgNyBjb2x1bW5zCmBgYHtyfQpzcGFycm93cyAlPiUgZ2dzY2F0bWF0KGNvbHVtbnMgPSAxOjcpCmBgYAojVGlzIGEgdGhpbmcgb2YgYmVhdXR5LCBhbmQgcmVhbGx5LCByZWFsbHkgZWFzeS4gIAoKI0ZpZ3VyZSAxMTogSW50ZXJhY3Rpb25zCmBgYHtyfQptb250aF9vcmRlciA8LSAgYygiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIikKc3BhcnJvd3MgJT4lCiAgZmlsdGVyKE1vbnRoICVpbiUgNTo5LAogICAgICAgICBTZXggIT0gMCkgJT4lCiAgbXV0YXRlKE1vbnRoID0gY2FzZV93aGVuKAogICAgTW9udGggPT0gNSB+ICJNYXkiLAogICAgTW9udGggPT0gNiB+ICJKdW5lIiwKICAgIE1vbnRoID09IDcgfiAiSnVseSIsCiAgICBNb250aCA9PSA4IH4gIkF1Z3VzdCIsCiAgICBNb250aCA9PSA5IH4gIlNlcHRlbWJlciIpLAogICAgTW9udGggPSBmYWN0b3IoTW9udGgsIGxldmVscyA9IG1vbnRoX29yZGVyLCBvcmRlcmVkID0gVFJVRSksCiAgICBTZXggPSBpZmVsc2UoU2V4ID09IDQsICJNYWxlIiwgIkZlbWFsZSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB3aW5nY3JkLAogICAgICAgICAgICAgeSA9IHd0KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSsKICBmYWNldF9ncmlkKFNleCB+IE1vbnRoKQpgYGAKIyMjIyBQYXJ0IDI6QWVnbGEgQ3JhYi1mZXN0IAojaW1wb3J0IHRoZSByYXcgZGF0YQpgYGB7cn0KYWVnbGFfcmF3IDwtIHJlYWRfY3N2KGZpbGUucGF0aChmaWxlX3BhdGgsICJhZWdsYV9jcmFicy5jc3YiKSkKYWVnbGFfcmF3CmBgYAojU2VsZWN0IHRvIHJlbW92ZSBjZXJ0YWluIGNvbHVtbnMKYGBge3J9CmFlZ2xhX3NlbGVjdCA8LSBzZWxlY3QoYWVnbGFfcmF3LCAtU2l0ZSwgLUFULCAtV1QsIC1TaHJpbXAsIC1BZWdsYW0sIC1BZWdsYUZlLCAtQWVnbGFGbykKYWVnbGFfc2VsZWN0CmBgYAojVXNlIGRyb3BfbmEgdG8gZHJvcCByb3cgd2l0aCBOQXMKYGBge3J9CmFlZ2xhX2Ryb3BuYSA8LSBhZWdsYV9zZWxlY3QgJT4lCiAgZHJvcF9uYSg0OjEyKQphZWdsYV9kcm9wbmEKYGBgCiNDcmVhdGUgdGhlIHJvd19vcmRlciBkdW1teSB2YXJpYWJsZQpgYGB7cn0KYWVnbGFfY2xlYW4gPC0gYWVnbGFfZHJvcG5hICU+JQogIG11dGF0ZShib3hfZ3JvdXAgPSAiQ3JhYnMiLAogICAgICAgICByb3dfb3JkZXIgPSAxOm5yb3coLikpCmFlZ2xhX2NsZWFuCmBgYAojVHJ5aW5nIHRoZSBtb3JlIGVmZmljaWVudCBwaXBlIG1ldGhvZC4KYGBge3J9CmFlZ2xhIDwtIGFlZ2xhX3JhdyAlPiUKICBzZWxlY3QoLWMoIlNpdGUiLCAiQVQiLCAiV1QiLCAiU2hyaW1wIiwgIkFlZ2xhbSIsICJBZWdsYUZlIiwgIkFlZ2xhRm8iKSklPiUKICBkcm9wX25hKGMoIk4iKSklPiUKICBtdXRhdGUoYm94X2dyb3VwID0gIkNyYWJzIiwKICAgICAgICAgcm93X29yZGVyID0gMTpucm93KC4pKQphZWdsYQpgYGAKI0V4cGxvcmUgdGhlIGRhdGEKYGBge3J9CnBfd2lkdGggPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9V2lkdGgpKQpwX2RlcHRoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PURlcHRoKSkKcF9mbG93IDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUZsb3cpKQpwX3BoIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PXBIKSkKcF90ZHMgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9VERTKSkKcF9jb25kPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9Q29uZCkpCnBfbiA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OKSkKcF9uaSA8LSBhZWdsYSAlPiUKICBnZ3Bsb3QoYWVzKHg9cm93X29yZGVyKSkrCiAgZ2VvbV9wb2ludChhZXMoeT1OaSkpCnBfbnQgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TnQpKQpwX3Bob3MgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9UGhvcykpCnBfbWcgPC0gYWVnbGEgJT4lCiAgZ2dwbG90KGFlcyh4PXJvd19vcmRlcikpKwogIGdlb21fcG9pbnQoYWVzKHk9TWcpKQpwX2NhIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNhKSkKcF9jcmFiIDwtIGFlZ2xhICU+JQogIGdncGxvdChhZXMoeD1yb3dfb3JkZXIpKSsKICBnZW9tX3BvaW50KGFlcyh5PUNyYWIpKQpwX3dpZHRoICsgcF9kZXB0aCArIHBfZmxvdyAKCmBgYAoKYGBge3J9CnBfcGggKyBwX3RkcyArIHBfY29uZCAgCmBgYApgYGB7cn0KcF9uICsgcF9uaSArIHBfbnQgCmBgYAoKYGBge3J9CnBfcGhvcyArIHBfbWcgKyBwX2NhICsgcF9jcmFiCmBgYApgYGB7cn0KZ2dwbG90KGFlZ2xhLCBhZXMoeD1yb3dfb3JkZXIsIHk9UGhvcykpKwogIGdlb21fYm94cGxvdCgpKwogIGdlb21fcG9pbnQoKQpgYGAKI1RoZSBvdXRsaWVycyBJIGZvdW5kIGFyZSBzYW1wbGUgMSwgd2hlcmUgdGhlIFBob3NwaGF0ZSBsZXZlbHMgYXJlIGFsbW9zdCA0IHRpbWVzIGhpZ2hlciB0aGFuIHRoZSBuZXh0IGhpZ2hlc3QgdmFsdWUsIHNhbXBsZSAxNCBoYXMgbG93IHBIIGF0IDYuMjUsIHdpdGggdGhlIG5leHQgbG93ZXN0IG1lYXN1cmVtZW50IGJlaW5nIDYuNzUgYW5kIDAgd2F0ZXJmbG93LCBhbmQgc2FtcGxlIDIyIHdhcyB0YWtlbiBhdCBhIHdpZHRoIG9mIDEyLjUgKG1ldGVycz8pIGFuZCBhIGRlcHRoIG9mIDUgbWV0ZXJzLiAgVGhlIHdpZHRoIG1lYXN1cmVtZW50IGlzIG5vdCBtdWNoIG9mIGFuIG91dGxpZXIsIGJ1dCB0aGUgZGVwdGggbWVhc3VyZW1lbnQgaXMgdHdpY2UgYXMgZGVlcCBhcyB0aGUgbmV4dCBoaWdoZXN0IHZhbHVlLiAgSSB3b3VsZCBjb250ZW5kIHRoYXQgdGhlIHJlYWwgb3V0bGllciBpcyB0aGUgcGhvc3BoYXRlIGxldmVsIGluIHNhbXBsZSAxLiAgCgojUGxvdCBmb3VyIHZhcmlhYmxlcyB3aXRoIGEgQ2xldmVsYW5kIHBsb3QuIEl0IGp1c3Qgc28gaGFwcGVuZWQgdGhhdCBJIG1hZGUgcGxvdHMgZm9yIGFsbCBvZiB0aGUgdmFyaWFibGVzLi4uIApgYGB7cn0KcF93aWR0aCArIHBfZGVwdGggKyBwX2NvbmQgKyBwX2NyYWIgKyBwbG90X2xheW91dChucm93ID0gMiwgbmNvbCA9IDIpCmBgYAojTWFrZSB0aHJlZSBoaXN0b2dyYW1zCmBgYHtyfQpoYTEgPC0gZ2dwbG90KGRhdGEgPSBhZWdsYSkrCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBOKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDI1LAogICAgICAgICAgICAgICAgIGJvdW5kYXJ5ID0gMCwKICAgICAgICAgICAgICAgICBjbG9zZWQgPSAicmlnaHQiLAogICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikKaGExCgoKCmBgYApgYGB7cn0KaGEyIDwtIGdncGxvdChkYXRhID0gYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PVBob3MpLAogICAgICAgICAgICAgICAgIGJpbndpZHRoID0gLjAwNSwKICAgICAgICAgICAgICAgICBib3VuZGFyeSA9IDAsCiAgICAgICAgICAgICAgICAgY2xvc2VkID0gInJpZ2h0IiwKICAgICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIikKaGEyCmBgYApgYGB7cn0KaGEzIDwtICBnZ3Bsb3QoYWVnbGEpKwogIGdlb21faGlzdG9ncmFtKGFlcyh4PXBIKSwKICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IC4wMDUsCiAgICAgICAgICAgICAgICAgYm91bmRhcnkgPSAwLAogICAgICAgICAgICAgICAgIGNsb3NlZCA9ICJyaWdodCIsCiAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIikKaGEzCmBgYAojQ3JlYXRlIGRlbnNpdHkgcGxvdHMKYGBge3J9CmhkcDEgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9TikpCmhkcDEKCmBgYApgYGB7cn0KaGRwMiA8LSBnZ3Bsb3QoYWVnbGEpKwogIGdlb21fZGVuc2l0eShhZXMoeD1QaG9zKSkKaGRwMgpgYGAKYGBge3J9CmhkcDMgPC0gZ2dwbG90KGFlZ2xhKSsKICBnZW9tX2RlbnNpdHkoYWVzKHg9cEgpKQpoZHAzCmBgYAojVXNlIHBhdGNod29yayB0byBwcm9kdWNlIDIgY29sIG1hdHJpeApgYGB7cn0KaGExICsgaGRwMSArIGhhMiArIGhkcDIgKyBoYTMgKyBoZHAzICsgcGxvdF9sYXlvdXQobmNvbD0yLCBucm93ID0gMykKYGBgCiNnZ3BhaXJzIHBsb3QuLi4gc2VlIHdoYXQgaGFwcGVucy4KYGBge3J9CmFlZ2xhICU+JSBnZ3BhaXJzCmBgYAojV293LiBUaGF0IGlzIGEgaHVnZSB0YWJsZS4gSSdtIGdvaW5nIHRvIHVzZSBnZ3NjYXRtYXQgZm9yIGEgZGlmZmVyZW50IHZpZXcuCmBgYHtyfQphZWdsYSAlPiUgZ2dzY2F0bWF0KCkKYGBgCiNJJ2Qgc2F5IHRoZXJlIGFyZSB0b28gbWFueSB2YXJpYWJsZXMgZ29pbmcgb24gdG8gYmUgdXNlZnVsLiAgQnV0IGlmIHdlIHBhcmUgaXQgZG93biBhIGJpdC4uLgpgYGB7cn0KYWVnbGEgJT4lIGdncGFpcnMoY29sdW1ucyA9IDE6NikKYGBgCiNUaGlzIG1ha2VzIGEgbG90IG1vcmUgc2Vuc2UuICBURFMgYW5kIENvbmR1Y3Rpdml0eSBoYXZlIGEgc3Ryb25nIGNvcnJlbGF0aW9uLCB3aGljaCBtYWtlcyBzZW5zZSB3aXRoIHNvbGlkcyBkZXNvdmVkIGluIHRoZSB3YXRlciwgcEggYW5kIFREUyBoYXZlIGEgcHJldHR5IGdvb2QgY29ycmVsYXRpb24gd2hpY2ggYWxzbyBtYWtlcyBzZW5zZS4gIEknbGwgdHJ5IHdpdGggdGhlIG90aGVyIHZhcmlhYmxlcy4gCgpgYGB7cn0KYWVnbGEgJT4lIGdncGFpcnMoY29sdW1ucyA9IDc6MTMpCmBgYAoKCgo=